在「Valid Parentheses」這道題目中,我們需要判斷一個只包含括號的字串是否有效。有效的括號字串需要符合以下條件:
(
、[
、{
必須有對應的右括號 )
、]
、}
。這道題主要考驗的是如何檢查括號的對應和巢狀順序,當遇到這種問題時,堆疊(stack)是一個非常合適的工具。因為堆疊的「後進先出」特性,能夠很好地幫助我們解決括號的巢狀問題。
(
、[
、{
時,將其對應的右括號 )
、]
、}
推入堆疊。這樣,當我們遇到一個右括號時,可以直接檢查堆疊頂部是否是它的對應括號。實作:
class Solution {
public:
bool isValid(string s) {
stack<char> stk;
for (int i = 0; i < s.size(); i++) {
if (s[i] == ')' && !stk.empty() && stk.top() == '(') {
stk.pop();
} else if (s[i] == '}' && !stk.empty() && stk.top() == '{') {
stk.pop();
} else if (s[i] == ']' && !stk.empty() && stk.top() == '[') {
stk.pop();
} else {
stk.push(s[i]);
}
}
return stk.empty();
}
};
左括號 & 右括號 的對應可以用 hash table 來輔助,這樣可以少很多條件式,條件式寫起來比較漂亮。修改後如下,
class Solution {
public:
bool isValid(string s) {
stack<char> stk;
unordered_map<char, char> map = {
{ ')', '(' },
{ '}', '{' },
{ ']', '[' }
};
for (int i = 0; i < s.size(); i++) {
//if (map.find(s[i]) == map.end()) {
if (!map.count(s[i])) {
// 左括號 push stack
stk.push(s[i]);
} else { // 右括號
if (stk.empty())
return false;
if (stk.top() != map[s[i]])
return false;
stk.pop();
}
}
return stk.empty();
}
};